package pl.koziolekweb.szkola.KZSerializacja;

// KZ-Serializacja/Main.java
 
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

//                      drzewko A             drzewko B
//                      ---------             ---------
//
//    pradziadkowie:       PAA                   PBA
//                        /   \                 /   \
//       dziadkowie:   DAA     DAB           DBA     DBB
//                              |             |
//          ojcowie:           OAA           OBA
//                            / | \           |
//          synowie:       SAA SAB SAC       SBA
//                            /   \         /   \
//         wnukowie:       WAA     WAB   WBA     WBB

public class Main {
    public static void main(String[] args) {

          // drzewo A
        Osoba[] wnukowieA = {
                    new Osoba("WAA",2000),
                    new Osoba("WAB",2001),
                };
        Osoba[] synowieA = {
                    new Osoba("SAA",1975),
                    new Osoba("SAB",1976,wnukowieA),
                    new Osoba("SAC",1977),
                };
        Osoba[] ojcowieA = {
                    new Osoba("OAA",1950,synowieA),
                };
        Osoba[] dziadkowieA = {
                    new Osoba("DAA",1925),
                    new Osoba("DAB",1926,ojcowieA),
                };

          // drzewo B
        Osoba[] wnukowieB = {
                    new Osoba("WBA",2002),
                    new Osoba("WBB",2003),
                };
        Osoba[] synowieB = {
                    new Osoba("SBA",1978,wnukowieB),
                };
        Osoba[] ojcowieB = {
                    new Osoba("OBA",1951,synowieB),
                };
        Osoba[] dziadkowieB = {
                    new Osoba("DBA",1927,ojcowieB),
                    new Osoba("DBB",1928),
                };

          // tablica pradziadkow z drzew A i B
        Osoba[] pradziadkowie = {
                    new Osoba("PAA",1900,dziadkowieA),
                    new Osoba("PBA",1901,dziadkowieB),
                };

        System.out.println("Przed serializacja:");
        System.out.println("=== PradziadekA ===");
        System.out.println(pradziadkowie[0]);

        System.out.println("=== PradziadekB ===");
        System.out.println(pradziadkowie[1]);

          // serializujemy tablice 'pradziadkowie'
          // na dysk za pomoca metody 'serNaDysk'
        serNaDysk(pradziadkowie,"osoby.dat");

          // ... i odczytujemy ja z dysku
          // za pomoca metody 'deSerZDysku'
        Osoba[] pra = (Osoba[])deSerZDysku("osoby.dat");

          // ... czy sie dobrze zapisalo i przeczytalo?
        System.out.println();
        System.out.println("Po deserializacji z dysku:");
        System.out.println("=== PradziadekA ===");
        System.out.println(pra[0]);

        System.out.println("=== PradziadekB ===");
        System.out.println(pra[1]);
    }

    static void serNaDysk(Object osoby, String file) {
        try {
            ObjectOutputStream oos =
                new ObjectOutputStream(
                new BufferedOutputStream(
                new FileOutputStream(file)));
            oos.writeObject(osoby);
            oos.close();
        }
        catch(IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    static Object deSerZDysku(String file) {
        Object ob = null;
        try {
            ObjectInputStream ois =
                new ObjectInputStream(
                new BufferedInputStream(
                new FileInputStream(file)));
            ob = ois.readObject();
            ois.close();
        }
        catch(IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
        catch(ClassNotFoundException e) {
            e.printStackTrace();
            System.exit(1);
        }
        return ob;
    }
}
